#include "AVDeMuxer.h"
#include<QDebug>
#include "AV_Common.h"


AVDeMuxer::AVDeMuxer()
    :quit_ (false)
{
  //创建解封装上下文文
    pFormatCtx_=avformat_alloc_context();
  //设置参数
  pFormatCtx_->max_ts_probe=50;
    pFormatCtx_->interrupt_callback.callback =InterruptFountion;//通过这个回调函数去停止拉流
  pFormatCtx_->interrupt_callback.opaque =this;
    //加速拉流
    pFormatCtx_->flags |= AVFMT_FLAG_DISCARD_CORRUPT;
}

bool AVDeMuxer::Open(const QString path)
{
    //打开流地址
    //启动线程
    readThread_.reset(new std::thread([this,path](){
        this->FetchStream(path);
    }));//[](){}
    return true;
}

void AVDeMuxer::Close()
{
    //将标志位置为true
    quit_ =true;
    //释放资源
    if(readThread_)
    {
    readThread_.reset();
    readThread_=nullptr;
    }
//封装格式上下文释放资源
if(pFormatCtx_)
    {
        avformat_free_context(pFormatCtx_);
    }
}

void AVDeMuxer::FetchStream(const QString path)
{
    //获取流信息
    bool ret = true;
    if(streamCb_)
    {
        ret = FetchStrea1mInfo(path);
        streamCb_(ret);
    }
    if(!ret)
    {
        return;
    }
    //创建一个packst，来接收编码数据
    AVPacketPtr packet = nullptr;
    while (!quit_ && pFormatCtx_){
        packet = AVPacketPtr(av_packet_alloc(),[](AVPacket* p){av_packet_free(&p);});
        //开始读取数据
        int re = av_read_frame(pFormatCtx_,packet.get());
        if (re==0)
        {
            if(packet->stream_index == videoIndex)
            {
                //视频包数据
                //开始解码音视频数据包
                qDebug()<<"视频包";
            }
            else if(packet->stream_index == AudioIndex)
            {
                //音频数据包
                qDebug()<<"音频包";
            }
        }
        else
        {
            av_packet_unref(packet.get());
            break;
        }
    }

}

bool AVDeMuxer::FetchStrea1mInfo(const QString path)
{
    //获取流信息
    if(avformat_open_input(&pFormatCtx_,path.toStdString().c_str(),nullptr,nullptr) !=0)
    {
        qDebug() <<"avformat_open_input failde";
        return false;

    }

    if(avformat_find_stream_info(pFormatCtx_,nullptr) < 0)
    {
        qDebug()<<"avformat_find_stream_info failde";
            return false;
    }

    for(int i=0;i<pFormatCtx_->nb_streams;i++)
    {
        if(pFormatCtx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
        {

            videoIndex=i;
        }
        else if(pFormatCtx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO)
        {
            AudioIndex=i;
        }
        else
        {
            continue;
        }

    }
    if(videoIndex !=-1)
    {
       //
        qDebug()<<"含有视频流";
    }
    if(AudioIndex !=-1)
    {

        qDebug()<<"含有音频流";
    }
    return true;
}

int AVDeMuxer::InterruptFountion(void *arg)
{
    AVDeMuxer* thiz = (AVDeMuxer*)arg;
    return thiz->quit_;//0 运行 1 停止
}
